/*
   Defines base attributes of a bookmark object

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. 
   If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.domain;

import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;

import com.freerdp.freerdpcore.application.GlobalApp;

import java.util.Locale;

public class BookmarkBase implements Parcelable, Cloneable {
    public static final int TYPE_INVALID = -1;
    public static final int TYPE_MANUAL = 1;
    public static final int TYPE_QUICKCONNECT = 2;
    public static final int TYPE_PLACEHOLDER = 3;
    public static final int TYPE_CUSTOM_BASE = 1000;
    public static final Parcelable.Creator<BookmarkBase> CREATOR = new Parcelable.Creator<BookmarkBase>() {
        public BookmarkBase createFromParcel(Parcel in) {
            return new BookmarkBase(in);
        }

        @Override
        public BookmarkBase[] newArray(int size) {
            return new BookmarkBase[size];
        }
    };
    protected int type;
    private long id;
    private String label;
    private String username;
    private String password;
    private String domain;
    private ScreenSettings screenSettings;
    private PerformanceFlags performanceFlags;
    private AdvancedSettings advancedSettings;
    private DebugSettings debugSettings;

    public BookmarkBase(Parcel parcel) {
        type = parcel.readInt();
        id = parcel.readLong();
        label = parcel.readString();
        username = parcel.readString();
        password = parcel.readString();
        domain = parcel.readString();

        screenSettings = parcel.readParcelable(ScreenSettings.class
                .getClassLoader());
        performanceFlags = parcel.readParcelable(PerformanceFlags.class
                .getClassLoader());
        advancedSettings = parcel.readParcelable(AdvancedSettings.class
                .getClassLoader());
        debugSettings = parcel.readParcelable(DebugSettings.class
                .getClassLoader());
    }

    public BookmarkBase() {
        init();
    }

    private void init() {
        type = TYPE_INVALID;
        id = -1;
        label = "";
        username = "";
        password = "";
        domain = "";

        screenSettings = new ScreenSettings();
        performanceFlags = new PerformanceFlags();
        advancedSettings = new AdvancedSettings();
        debugSettings = new DebugSettings();
    }

    @SuppressWarnings("unchecked")
    public <T extends BookmarkBase> T get() {
        return (T) this;
    }

    public int getType() {
        return type;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDomain() {
        return domain;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    public ScreenSettings getScreenSettings() {
        return screenSettings;
    }

    public void setScreenSettings(ScreenSettings screenSettings) {
        this.screenSettings = screenSettings;
    }

    public PerformanceFlags getPerformanceFlags() {
        return performanceFlags;
    }

    public void setPerformanceFlags(PerformanceFlags performanceFlags) {
        this.performanceFlags = performanceFlags;
    }

    public AdvancedSettings getAdvancedSettings() {
        return advancedSettings;
    }

    public void setAdvancedSettings(AdvancedSettings advancedSettings) {
        this.advancedSettings = advancedSettings;
    }

    public DebugSettings getDebugSettings() {
        return debugSettings;
    }

    public void setDebugSettings(DebugSettings debugSettings) {
        this.debugSettings = debugSettings;
    }

    public ScreenSettings getActiveScreenSettings() {
        return (GlobalApp.ConnectedTo3G && advancedSettings
                .getEnable3GSettings()) ? advancedSettings.getScreen3G()
                : screenSettings;
    }

    public PerformanceFlags getActivePerformanceFlags() {
        return (GlobalApp.ConnectedTo3G && advancedSettings
                .getEnable3GSettings()) ? advancedSettings.getPerformance3G()
                : performanceFlags;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(type);
        out.writeLong(id);
        out.writeString(label);
        out.writeString(username);
        out.writeString(password);
        out.writeString(domain);

        out.writeParcelable(screenSettings, flags);
        out.writeParcelable(performanceFlags, flags);
        out.writeParcelable(advancedSettings, flags);
        out.writeParcelable(debugSettings, flags);
    }

    // write to shared preferences
    public void writeToSharedPreferences(SharedPreferences sharedPrefs) {

        Locale locale = Locale.ENGLISH;

        SharedPreferences.Editor editor = sharedPrefs.edit();
        editor.clear();
        editor.putString("bookmark.label", label);
        editor.putString("bookmark.username", username);
        editor.putString("bookmark.password", password);
        editor.putString("bookmark.domain", domain);

        editor.putInt("bookmark.colors", screenSettings.getColors());
        editor.putString("bookmark.resolution", screenSettings
                .getResolutionString().toLowerCase(locale));
        editor.putInt("bookmark.width", screenSettings.getWidth());
        editor.putInt("bookmark.height", screenSettings.getHeight());

        editor.putBoolean("bookmark.perf_remotefx",
                performanceFlags.getRemoteFX());
        editor.putBoolean("bookmark.perf_gfx",
                performanceFlags.getGfx());
        editor.putBoolean("bookmark.perf_gfx_h264",
                performanceFlags.getH264());
        editor.putBoolean("bookmark.perf_wallpaper",
                performanceFlags.getWallpaper());
        editor.putBoolean("bookmark.perf_font_smoothing",
                performanceFlags.getFontSmoothing());
        editor.putBoolean("bookmark.perf_desktop_composition",
                performanceFlags.getDesktopComposition());
        editor.putBoolean("bookmark.perf_window_dragging",
                performanceFlags.getFullWindowDrag());
        editor.putBoolean("bookmark.perf_menu_animation",
                performanceFlags.getMenuAnimations());
        editor.putBoolean("bookmark.perf_themes", performanceFlags.getTheming());

        editor.putBoolean("bookmark.enable_3g_settings",
                advancedSettings.getEnable3GSettings());

        editor.putInt("bookmark.colors_3g", advancedSettings.getScreen3G()
                .getColors());
        editor.putString("bookmark.resolution_3g", advancedSettings
                .getScreen3G().getResolutionString().toLowerCase(locale));
        editor.putInt("bookmark.width_3g", advancedSettings.getScreen3G()
                .getWidth());
        editor.putInt("bookmark.height_3g", advancedSettings.getScreen3G()
                .getHeight());

        editor.putBoolean("bookmark.perf_remotefx_3g", advancedSettings
                .getPerformance3G().getRemoteFX());
        editor.putBoolean("bookmark.perf_gfx_3g", advancedSettings
                .getPerformance3G().getGfx());
        editor.putBoolean("bookmark.perf_gfx_h264_3g", advancedSettings
                .getPerformance3G().getH264());
        editor.putBoolean("bookmark.perf_wallpaper_3g", advancedSettings
                .getPerformance3G().getWallpaper());
        editor.putBoolean("bookmark.perf_font_smoothing_3g", advancedSettings
                .getPerformance3G().getFontSmoothing());
        editor.putBoolean("bookmark.perf_desktop_composition_3g",
                advancedSettings.getPerformance3G().getDesktopComposition());
        editor.putBoolean("bookmark.perf_window_dragging_3g", advancedSettings
                .getPerformance3G().getFullWindowDrag());
        editor.putBoolean("bookmark.perf_menu_animation_3g", advancedSettings
                .getPerformance3G().getMenuAnimations());
        editor.putBoolean("bookmark.perf_themes_3g", advancedSettings
                .getPerformance3G().getTheming());

        editor.putBoolean("bookmark.redirect_sdcard",
                advancedSettings.getRedirectSDCard());
        editor.putInt("bookmark.redirect_sound",
                advancedSettings.getRedirectSound());
        editor.putBoolean("bookmark.redirect_microphone",
                advancedSettings.getRedirectMicrophone());
        editor.putInt("bookmark.security", advancedSettings.getSecurity());
        editor.putString("bookmark.remote_program",
                advancedSettings.getRemoteProgram());
        editor.putString("bookmark.work_dir", advancedSettings.getWorkDir());
        editor.putBoolean("bookmark.console_mode",
                advancedSettings.getConsoleMode());

        editor.putBoolean("bookmark.async_channel", debugSettings.getAsyncChannel());
        editor.putBoolean("bookmark.async_input", debugSettings.getAsyncInput());
        editor.putBoolean("bookmark.async_update", debugSettings.getAsyncUpdate());
        editor.putString("bookmark.debug_level",
                debugSettings.getDebugLevel());

        editor.apply();
    }

    // read from shared preferences
    public void readFromSharedPreferences(SharedPreferences sharedPrefs) {
        label = sharedPrefs.getString("bookmark.label", "");
        username = sharedPrefs.getString("bookmark.username", "");
        password = sharedPrefs.getString("bookmark.password", "");
        domain = sharedPrefs.getString("bookmark.domain", "");

        screenSettings.setColors(sharedPrefs.getInt("bookmark.colors", 16));
        screenSettings.setResolution(
                sharedPrefs.getString("bookmark.resolution", "automatic"),
                sharedPrefs.getInt("bookmark.width", 800),
                sharedPrefs.getInt("bookmark.height", 600));

        performanceFlags.setRemoteFX(sharedPrefs.getBoolean(
                "bookmark.perf_remotefx", false));
        performanceFlags.setGfx(sharedPrefs.getBoolean(
                "bookmark.perf_gfx", false));
        performanceFlags.setH264(sharedPrefs.getBoolean(
                "bookmark.perf_gfx_h264", false));
        performanceFlags.setWallpaper(sharedPrefs.getBoolean(
                "bookmark.perf_wallpaper", false));
        performanceFlags.setFontSmoothing(sharedPrefs.getBoolean(
                "bookmark.perf_font_smoothing", false));
        performanceFlags.setDesktopComposition(sharedPrefs.getBoolean(
                "bookmark.perf_desktop_composition", false));
        performanceFlags.setFullWindowDrag(sharedPrefs.getBoolean(
                "bookmark.perf_window_dragging", false));
        performanceFlags.setMenuAnimations(sharedPrefs.getBoolean(
                "bookmark.perf_menu_animation", false));
        performanceFlags.setTheming(sharedPrefs.getBoolean(
                "bookmark.perf_themes", false));

        advancedSettings.setEnable3GSettings(sharedPrefs.getBoolean(
                "bookmark.enable_3g_settings", false));

        advancedSettings.getScreen3G().setColors(
                sharedPrefs.getInt("bookmark.colors_3g", 16));
        advancedSettings.getScreen3G().setResolution(
                sharedPrefs.getString("bookmark.resolution_3g", "automatic"),
                sharedPrefs.getInt("bookmark.width_3g", 800),
                sharedPrefs.getInt("bookmark.height_3g", 600));

        advancedSettings.getPerformance3G().setRemoteFX(
                sharedPrefs.getBoolean("bookmark.perf_remotefx_3g", false));
        advancedSettings.getPerformance3G().setGfx(sharedPrefs.getBoolean(
                "bookmark.perf_gfx_3g", false));
        advancedSettings.getPerformance3G().setH264(sharedPrefs.getBoolean(
                "bookmark.perf_gfx_h264_3g", false));
        advancedSettings.getPerformance3G().setWallpaper(
                sharedPrefs.getBoolean("bookmark.perf_wallpaper_3g", false));
        advancedSettings.getPerformance3G().setFontSmoothing(
                sharedPrefs
                        .getBoolean("bookmark.perf_font_smoothing_3g", false));
        advancedSettings.getPerformance3G().setDesktopComposition(
                sharedPrefs.getBoolean("bookmark.perf_desktop_composition_3g",
                        false));
        advancedSettings.getPerformance3G().setFullWindowDrag(
                sharedPrefs.getBoolean("bookmark.perf_window_dragging_3g",
                        false));
        advancedSettings.getPerformance3G().setMenuAnimations(
                sharedPrefs
                        .getBoolean("bookmark.perf_menu_animation_3g", false));
        advancedSettings.getPerformance3G().setTheming(
                sharedPrefs.getBoolean("bookmark.perf_themes_3g", false));

        advancedSettings.setRedirectSDCard(sharedPrefs.getBoolean("bookmark.redirect_sdcard", false));
        advancedSettings.setRedirectSound(sharedPrefs.getInt("bookmark.redirect_sound", 0));
        advancedSettings.setRedirectMicrophone(sharedPrefs.getBoolean("bookmark.redirect_microphone", false));
        advancedSettings.setSecurity(sharedPrefs.getInt("bookmark.security", 0));
        advancedSettings.setRemoteProgram(sharedPrefs.getString("bookmark.remote_program", ""));
        advancedSettings.setWorkDir(sharedPrefs.getString("bookmark.work_dir", ""));
        advancedSettings.setConsoleMode(sharedPrefs.getBoolean("bookmark.console_mode", false));

        debugSettings.setAsyncChannel(sharedPrefs.getBoolean("bookmark.async_channel", true));
        debugSettings.setAsyncInput(sharedPrefs.getBoolean("bookmark.async_input", true));
        debugSettings.setAsyncUpdate(sharedPrefs.getBoolean("bookmark.async_update", true));
        debugSettings.setDebugLevel(sharedPrefs.getString("bookmark.debug_level", "INFO"));
    }

    // Cloneable
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }

    // performance flags
    public static class PerformanceFlags implements Parcelable {
        public static final Parcelable.Creator<PerformanceFlags> CREATOR = new Parcelable.Creator<PerformanceFlags>() {
            public PerformanceFlags createFromParcel(Parcel in) {
                return new PerformanceFlags(in);
            }

            @Override
            public PerformanceFlags[] newArray(int size) {
                return new PerformanceFlags[size];
            }
        };
        private boolean remotefx;
        private boolean gfx;
        private boolean h264;
        private boolean wallpaper;
        private boolean theming;
        private boolean fullWindowDrag;
        private boolean menuAnimations;
        private boolean fontSmoothing;
        private boolean desktopComposition;

        public PerformanceFlags() {
            remotefx = false;
            gfx = false;
            h264 = false;
            wallpaper = false;
            theming = false;
            fullWindowDrag = false;
            menuAnimations = false;
            fontSmoothing = false;
            desktopComposition = false;
        }

        public PerformanceFlags(Parcel parcel) {
            remotefx = parcel.readInt() == 1;
            gfx = parcel.readInt() == 1;
            h264 = parcel.readInt() == 1;
            wallpaper = parcel.readInt() == 1;
            theming = parcel.readInt() == 1;
            fullWindowDrag = (parcel.readInt() == 1);
            menuAnimations = parcel.readInt() == 1;
            fontSmoothing = parcel.readInt() == 1;
            desktopComposition = parcel.readInt() == 1;
        }

        public boolean getRemoteFX() {
            return remotefx;
        }

        public void setRemoteFX(boolean remotefx) {
            this.remotefx = remotefx;
        }

        public boolean getGfx() {
            return gfx;
        }

        public void setGfx(boolean gfx) {
            this.gfx = gfx;
        }

        public boolean getH264() {
            return h264;
        }

        public void setH264(boolean h264) {
            this.h264 = h264;
        }

        public boolean getWallpaper() {
            return wallpaper;
        }

        public void setWallpaper(boolean wallpaper) {
            this.wallpaper = wallpaper;
        }

        public boolean getTheming() {
            return theming;
        }

        public void setTheming(boolean theming) {
            this.theming = theming;
        }

        public boolean getFullWindowDrag() {
            return fullWindowDrag;
        }

        public void setFullWindowDrag(boolean fullWindowDrag) {
            this.fullWindowDrag = fullWindowDrag;
        }

        public boolean getMenuAnimations() {
            return menuAnimations;
        }

        public void setMenuAnimations(boolean menuAnimations) {
            this.menuAnimations = menuAnimations;
        }

        public boolean getFontSmoothing() {
            return fontSmoothing;
        }

        public void setFontSmoothing(boolean fontSmoothing) {
            this.fontSmoothing = fontSmoothing;
        }

        public boolean getDesktopComposition() {
            return desktopComposition;
        }

        public void setDesktopComposition(boolean desktopComposition) {
            this.desktopComposition = desktopComposition;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            out.writeInt(remotefx ? 1 : 0);
            out.writeInt(gfx ? 1 : 0);
            out.writeInt(h264 ? 1 : 0);
            out.writeInt(wallpaper ? 1 : 0);
            out.writeInt(theming ? 1 : 0);
            out.writeInt(fullWindowDrag ? 1 : 0);
            out.writeInt(menuAnimations ? 1 : 0);
            out.writeInt(fontSmoothing ? 1 : 0);
            out.writeInt(desktopComposition ? 1 : 0);
        }
    }

    // Screen Settings class
    public static class ScreenSettings implements Parcelable {
        public static final int FITSCREEN = -2;
        public static final int AUTOMATIC = -1;
        public static final int CUSTOM = 0;
        public static final int PREDEFINED = 1;
        public static final Parcelable.Creator<ScreenSettings> CREATOR = new Parcelable.Creator<ScreenSettings>() {
            public ScreenSettings createFromParcel(Parcel in) {
                return new ScreenSettings(in);
            }

            @Override
            public ScreenSettings[] newArray(int size) {
                return new ScreenSettings[size];
            }
        };
        private int resolution;
        private int colors;
        private int width;
        private int height;

        public ScreenSettings() {
            init();
        }

        public ScreenSettings(Parcel parcel) {
            resolution = parcel.readInt();
            colors = parcel.readInt();
            width = parcel.readInt();
            height = parcel.readInt();
        }

        private void validate() {
            switch (colors) {
                case 32:
                case 24:
                case 16:
                case 15:
                case 8:
                    break;
                default:
                    colors = 32;
                    break;
            }

            if ((width <= 0) || (width > 65536)) {
                width = 1024;
            }

            if ((height <= 0) || (height > 65536)) {
                height = 768;
            }

            switch(resolution) {
                case FITSCREEN:
                case AUTOMATIC:
                case CUSTOM:
                case PREDEFINED:
                    break;
                default:
                    resolution = AUTOMATIC;
                    break;
            }
        }

        private void init() {
            resolution = AUTOMATIC;
            colors = 16;
            width = 0;
            height = 0;
        }

        public void setResolution(String resolution, int width, int height) {
            if (resolution.contains("x")) {
                String[] dimensions = resolution.split("x");
                this.width = Integer.valueOf(dimensions[0]);
                this.height = Integer.valueOf(dimensions[1]);
                this.resolution = PREDEFINED;
            } else if (resolution.equalsIgnoreCase("custom")) {
                this.width = width;
                this.height = height;
                this.resolution = CUSTOM;
            } else if (resolution.equalsIgnoreCase("fitscreen")) {
                this.width = this.height = 0;
                this.resolution = FITSCREEN;
            } else {
                this.width = this.height = 0;
                this.resolution = AUTOMATIC;
            }
        }

        public int getResolution() {
            return resolution;
        }

        public void setResolution(int resolution) {
            this.resolution = resolution;

            if (resolution == AUTOMATIC || resolution == FITSCREEN) {
                width = 0;
                height = 0;
            }
        }

        public String getResolutionString() {
            if (isPredefined())
                return (width + "x" + height);

            return (isFitScreen() ? "fitscreen" : isAutomatic() ? "automatic"
                    : "custom");
        }

        public boolean isPredefined() {
            validate();
            return (resolution == PREDEFINED);
        }

        public boolean isAutomatic() {
            validate();
            return (resolution == AUTOMATIC);
        }

        public boolean isFitScreen() {
            validate();
            return (resolution == FITSCREEN);
        }

        public boolean isCustom() {
            validate();
            return (resolution == CUSTOM);
        }

        public int getWidth() {
            validate();
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            validate();
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        public int getColors() {
            validate();
            return colors;
        }

        public void setColors(int colors) {
            this.colors = colors;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            out.writeInt(resolution);
            out.writeInt(colors);
            out.writeInt(width);
            out.writeInt(height);
        }
    }

    public static class DebugSettings implements Parcelable {

        public static final Parcelable.Creator<DebugSettings> CREATOR = new Parcelable.Creator<DebugSettings>() {
            public DebugSettings createFromParcel(Parcel in) {
                return new DebugSettings(in);
            }

            @Override
            public DebugSettings[] newArray(int size) {
                return new DebugSettings[size];
            }
        };
        private String debug;
        private boolean asyncChannel;
        private boolean asyncTransport;
        private boolean asyncInput;
        private boolean asyncUpdate;

        public DebugSettings() {
            init();
        }

        // Session Settings
        public DebugSettings(Parcel parcel) {
            asyncChannel = parcel.readInt() == 1;
            asyncTransport = parcel.readInt() == 1;
            asyncInput = parcel.readInt() == 1;
            asyncUpdate = parcel.readInt() == 1;
            debug = parcel.readString();
        }

        private void init() {
            debug = "INFO";
            asyncChannel = true;
            asyncTransport = false;
            asyncInput = true;
            asyncUpdate = true;
        }

        private void validate() {
            final String[] levels = {
                    "OFF",
                    "FATAL",
                    "ERROR",
                    "WARN",
                    "INFO",
                    "DEBUG",
                    "TRACE"
            };

            for (String level : levels) {
                if (level.equalsIgnoreCase(this.debug)) {
                    return;
                }
            }

            this.debug = "INFO";
        }

        public String getDebugLevel() {
            validate();
            return debug;
        }

        public void setDebugLevel(String debug) {
            this.debug = debug;
        }

        public boolean getAsyncUpdate() {
            return asyncUpdate;
        }

        public void setAsyncUpdate(boolean enabled) {
            asyncUpdate = enabled;
        }

        public boolean getAsyncInput() {
            return asyncInput;
        }

        public void setAsyncInput(boolean enabled) {
            asyncInput = enabled;
        }

        public boolean getAsyncChannel() {
            return asyncChannel;
        }

        public void setAsyncChannel(boolean enabled) {
            asyncChannel = enabled;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            out.writeInt(asyncChannel ? 1 : 0);
            out.writeInt(asyncTransport ? 1 : 0);
            out.writeInt(asyncInput ? 1 : 0);
            out.writeInt(asyncUpdate ? 1 : 0);
            out.writeString(debug);
        }
    }

    // Session Settings
    public static class AdvancedSettings implements Parcelable {
        public static final Parcelable.Creator<AdvancedSettings> CREATOR = new Parcelable.Creator<AdvancedSettings>() {
            public AdvancedSettings createFromParcel(Parcel in) {
                return new AdvancedSettings(in);
            }

            @Override
            public AdvancedSettings[] newArray(int size) {
                return new AdvancedSettings[size];
            }
        };
        private boolean enable3GSettings;
        private ScreenSettings screen3G;
        private PerformanceFlags performance3G;
        private boolean redirectSDCard;
        private int redirectSound;
        private boolean redirectMicrophone;
        private int security;
        private boolean consoleMode;
        private String remoteProgram;
        private String workDir;

        public AdvancedSettings() {
            init();
        }

        public AdvancedSettings(Parcel parcel) {
            enable3GSettings = parcel.readInt() == 1;
            screen3G = parcel.readParcelable(ScreenSettings.class
                    .getClassLoader());
            performance3G = parcel.readParcelable(PerformanceFlags.class
                    .getClassLoader());
            redirectSDCard = parcel.readInt() == 1;
            redirectSound = parcel.readInt();
            redirectMicrophone = parcel.readInt() == 1;
            security = parcel.readInt();
            consoleMode = parcel.readInt() == 1;
            remoteProgram = parcel.readString();
            workDir = parcel.readString();
        }

        private void init() {
            enable3GSettings = false;
            screen3G = new ScreenSettings();
            performance3G = new PerformanceFlags();
            redirectSDCard = false;
            redirectSound = 0;
            redirectMicrophone = false;
            security = 0;
            consoleMode = false;
            remoteProgram = "";
            workDir = "";
        }

        private void validate() {
            switch (redirectSound) {
                case 0:
                case 1:
                case 2:
                    break;
                default:
                    redirectSound = 0;
                    break;
            }

            switch (security) {
                case 0:
                case 1:
                case 2:
                case 3:
                    break;
                default:
                    security = 0;
                    break;
            }
        }

        public boolean getEnable3GSettings() {
            return enable3GSettings;
        }

        public void setEnable3GSettings(boolean enable3GSettings) {
            this.enable3GSettings = enable3GSettings;
        }

        public ScreenSettings getScreen3G() {
            return screen3G;
        }

        public void setScreen3G(ScreenSettings screen3G) {
            this.screen3G = screen3G;
        }

        public PerformanceFlags getPerformance3G() {
            return performance3G;
        }

        public void setPerformance3G(PerformanceFlags performance3G) {
            this.performance3G = performance3G;
        }

        public boolean getRedirectSDCard() {
            return redirectSDCard;
        }

        public void setRedirectSDCard(boolean redirectSDCard) {
            this.redirectSDCard = redirectSDCard;
        }

        public int getRedirectSound() {
            validate();
            return redirectSound;
        }

        public void setRedirectSound(int redirect) {
            this.redirectSound = redirect;
        }

        public boolean getRedirectMicrophone() {
            return redirectMicrophone;
        }

        public void setRedirectMicrophone(boolean redirect) {
            this.redirectMicrophone = redirect;
        }

        public int getSecurity() {
            validate();
            return security;
        }

        public void setSecurity(int security) {
            this.security = security;
        }

        public boolean getConsoleMode() {
            return consoleMode;
        }

        public void setConsoleMode(boolean consoleMode) {
            this.consoleMode = consoleMode;
        }

        public String getRemoteProgram() {
            return remoteProgram;
        }

        public void setRemoteProgram(String remoteProgram) {
            this.remoteProgram = remoteProgram;
        }

        public String getWorkDir() {
            return workDir;
        }

        public void setWorkDir(String workDir) {
            this.workDir = workDir;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            out.writeInt(enable3GSettings ? 1 : 0);
            out.writeParcelable(screen3G, flags);
            out.writeParcelable(performance3G, flags);
            out.writeInt(redirectSDCard ? 1 : 0);
            out.writeInt(redirectSound);
            out.writeInt(redirectMicrophone ? 1 : 0);
            out.writeInt(security);
            out.writeInt(consoleMode ? 1 : 0);
            out.writeString(remoteProgram);
            out.writeString(workDir);
        }
    }
}
